package script

import (
	"errors"
	"fmt"
	"gitee.com/fierce_wolf/go-fox-edge-common/commUtil/Charts"
	"gitee.com/fierce_wolf/go-fox-edge-common/commUtil/Hex"
	"github.com/dop251/goja"
)

type Decoder struct {
	engine *goja.Runtime // 执行引擎
	script string        // 解码器脚本
	format string        //数据格式：HEX或者TXT
}

func (e *Decoder) Decode(buff []byte, end int) (str string, err error) {
	// 定义一个最终的异常拦截，用来防止可能的代码BUG
	defer func() {
		if r := recover(); r != nil {
			str = ""
			err = errors.New(fmt.Sprintf("捕获到异常:%v", r))
		}
	}()

	// 转换成文本
	message := ""
	if e.format == "TXT" {
		// GB2312编码的字符串，在GO的字符库中标识为GBK
		utf8Bytes, err := Charts.GbkToUtf8Str(buff[0:end])
		if err != nil {
			return "", err
		} else {
			message = string(utf8Bytes)
		}
	} else {
		message = Hex.EncodeToString(buff[0:end])
	}

	// 执行JSP脚本中的函数
	decode, ok := goja.AssertFunction(e.engine.Get("decode"))
	if !ok {
		return "", errors.New("找不到decode()函数")
	}

	// 执行函数
	res, err := decode(goja.Undefined(), e.engine.ToValue(message))
	if err != nil {
		return "", err
	}

	return res.String(), nil
}
